package cliente.reserva;

import java.awt.event.ActionEvent;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.AbstractAction;
import javax.swing.JOptionPane;

import cpf.CPF;

import mensagens.EnviaDados;
import mensagens.ManterReserva;
import mensagens.Mensagem;

import cliente.tipos.Reserva;

@SuppressWarnings("serial")
public class ExecutaProcurarReserva extends AbstractAction{

	private ProcurarReserva pr;
	private Reserva reservaConfirmar;
	
	public ExecutaProcurarReserva(ProcurarReserva pr) {
		setPr(pr);
		setReservaConfirmar(null);
	}
	
	@Override
	public void actionPerformed(ActionEvent event) {
		// Verifica o evento recebido
		if("fechar".equals(event.getActionCommand())){
			getPr().getTfProcurarReserva().dispose();
		} else if("procurar".equals(event.getActionCommand())){
			Reserva r = new Reserva();
			SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
			
			// Tenta ler o id do Hóspede
			try{ r.getHospedeId().setCpf(getPr().gettNomeCliente().getText());
			} catch (NumberFormatException nfe) {
				JOptionPane.showMessageDialog(getPr().getTfProcurarReserva(),"Código do cliente não é um número válido!", "Erro!",JOptionPane.ERROR_MESSAGE);
				return;
			}
			if(!CPF.validaCPF(r.getHospedeId().getCpf())){
				JOptionPane.showMessageDialog(getPr().getTfProcurarReserva(),"Informe um CPF válido!", "Erro!",JOptionPane.ERROR_MESSAGE);
				getPr().settNomeCliente(null);
				return;
			}
			
			// Tenta ler a data de incício e fim
			try {
				r.setDataInicio(df.parse(getPr().gettDataIni().getText()));
			} catch (ParseException e) {
				e.printStackTrace();
				return;
			}
			// Verifica se a data de entrada é vazia
			if(r.getDataInicio().equals("")){
				JOptionPane.showMessageDialog(getPr().getTfProcurarReserva(),"Favor digitar a data de entrada!", "Erro!",JOptionPane.ERROR_MESSAGE);
				return;
			}
			
			
			ManterReserva mr = new ManterReserva(2);
			mr.setReserva(r);
			
			Mensagem response = EnviaDados.enviarMensagem(mr);
			
			if(response instanceof ManterReserva){
				mr = (ManterReserva) response;
				if(mr.getTipoManterReserva() == 21){
					getPr().gettNomeCliente().setText(mr.getReserva().getHospedeId().getCpf());
					getPr().gettDataIni().setText(df.format(mr.getReserva().getDataInicio()));
					getPr().gettDataFim().setText(df.format(mr.getReserva().getDataInicio()));
					getPr().gettValorEntrada().setText(mr.getReserva().getValorEntrada().toString());
					getPr().gettNumAp().setText(new Integer(mr.getReserva().getAp().getNumero()).toString());
					// Seta a reserva global
					setReservaConfirmar(mr.getReserva());
					// reservaConfirmar = new Reserva();
					//reservaConfirmar.setId(mr.getReserva().getId());
					//reservaConfirmar.setAp(mr.getReserva().getAp());
					//reservaConfirmar.setDataInicio(mr.getReserva().getDataInicio());
					//reservaConfirmar.setDataFim(mr.getReserva().getDataFim());
					//reservaConfirmar.setHospedeId(mr.getReserva().getHospedeId());
					// reservaConfirmar.setValorEntrada(mr.getReserva().getValorEntrada());
					//if(reservaConfirmar==null)System.out.println("Vazio!");
				} else if(mr.getTipoManterReserva() == 22){
					JOptionPane.showMessageDialog(getPr().getTfProcurarReserva(),"Reserva não encontrada!","Erro!",JOptionPane.ERROR_MESSAGE);
					return;
				}
			} else {
				System.out.println("Tipo de reposta inválida!");
			}
			
		} else if("alterar".equals(event.getActionCommand())){
			
		} else if("apagar".equals(event.getActionCommand())){
			
		} else if("confirmar".equals(event.getActionCommand())){
			// Verifica primeiro se a reserva a cofirma é de hoje (o hóspede só pode ser registrado no dia em que inicia a reserva)
			/*
			if((getReservaConfirmar().getDataInicio().before(new Date()))|(getReservaConfirmar().getDataInicio().after(new Date())) ){
				JOptionPane.showMessageDialog(getPr().getTfProcurarReserva(),"Esta reserva não inicia hoje!","Erro!",JOptionPane.ERROR_MESSAGE);
			} else {
			*/
				int i = JOptionPane.showConfirmDialog(getPr().getTfProcurarReserva(), "Confirma o checkin do cliente?","Confirmação!", JOptionPane.OK_CANCEL_OPTION);
				// Se foi confirmado:
				if(i == 0){
					if(reservaConfirmar != null){
						ManterReserva mr = new ManterReserva(5);
						mr.setReserva(reservaConfirmar);
						Mensagem response = EnviaDados.enviarMensagem(mr);
						if(response instanceof ManterReserva){
							mr = (ManterReserva) response;
							if(mr.getTipoManterReserva() == 51){
								JOptionPane.showMessageDialog(getPr().getTfProcurarReserva(), "Checkin efetuado com sucesso!","Info",JOptionPane.INFORMATION_MESSAGE);
								getPr().getTfProcurarReserva().dispose();
							} else if (mr.getTipoManterReserva() == 52){
								JOptionPane.showMessageDialog(getPr().getTfProcurarReserva(),"Ocorreu um erro!","Erro!",JOptionPane.ERROR_MESSAGE);
							} else JOptionPane.showMessageDialog(getPr().getTfProcurarReserva(),"Ocorreu um erro desconhecido, favor contatar o desenvolvedor!","Erro!",JOptionPane.ERROR_MESSAGE);
						} else {
							System.out.println("Tipo de mensagem errado recebido!");
						}
					} else {
						JOptionPane.showMessageDialog(getPr().getTfProcurarReserva(),"Localize a reserva primeiro!","Erro!",JOptionPane.ERROR_MESSAGE);
					}
				}
			}
		}
	// }

	public void setPr(ProcurarReserva pr) {
		this.pr = pr;
	}

	public ProcurarReserva getPr() {
		return pr;
	}

	public Reserva getReservaConfirmar() {
		return reservaConfirmar;
	}

	public void setReservaConfirmar(Reserva reservaConfirmar) {
		this.reservaConfirmar = reservaConfirmar;
	}

}
